package cn.iocoder.yudao.framework.xss.core.test;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.safety.Safelist;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/**
 * Jsoup快速入门（解析XML文件）
 */
public class JsoupDemo1_StudentXml {
    public static void main1(String[] args) throws IOException {
        //2、获取Document对象，根据xml文档来获取
        
        //2.1获取student.xml的path
        String path = JsoupDemo1_StudentXml.class.getClassLoader().
        getResource("student.xml").getPath();
        
        //2.2解析xml文档，加载文档进内存，获取dom树
        Document document = Jsoup.parse(new File(path), "utf-8");
        
        //3.获取元素对象Element
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        
        for(Element el:elements){
            System.out.println(el.text());
        }
//        //3.1获取第一个Element对象的name
//        Element element = elements.get(0);
//        //3.2获取数据
//        String name = element.text();
//        System.out.println(name);

    }

    public static void main(String[] args) throws IOException {
        //parse​(String html)：解析字符串的
        String html="<!--?xml version=\"1.0\" encoding=\"UTF-8\" ?-->\n" +
                "<html><head></head><body>\n" +
                "  <students> \n" +
                "   <student number=\"heima_0001\"> \n" +
                "    <name>zhangsan</name><age>100</age><sex>female</sex> \n" +
                "   </student> \n" +
                "   <student number=\"heima_0002\"> \n" +
                "    <name>lisi</name><age>45</age><sex>female</sex> \n" +
                "   </student> \n" +
                "  </students>\n" +
                " </body></html>";
        Document document = Jsoup.parse(html);
        System.out.println(document);

        String clean = Jsoup.clean(html, ".", buildSafelist(), new Document.OutputSettings().prettyPrint(false));
        System.out.println(clean);
    }

    private static Safelist buildSafelist() {
        // 使用 jsoup 提供的默认的
        Safelist relaxedSafelist = Safelist.relaxed();
        // 富文本编辑时一些样式是使用 style 来进行实现的
        // 比如红色字体 style="color:red;", 所以需要给所有标签添加 style 属性
        // 注意：style 属性会有注入风险 <img STYLE="background-image:url(javascript:alert('XSS'))">
        relaxedSafelist.addAttributes(":all", "style", "class");
        // 保留 a 标签的 target 属性
        relaxedSafelist.addAttributes("a", "target");
        // 支持img 为base64
        relaxedSafelist.addProtocols("img", "src", "data");

        // 保留相对路径, 保留相对路径时，必须提供对应的 baseUri 属性，否则依然会被删除
        // WHITELIST.preserveRelativeLinks(false);

        // 移除 a 标签和 img 标签的一些协议限制，这会导致 xss 防注入失效，如 <img src=javascript:alert("xss")>
        // 虽然可以重写 WhiteList#isSafeAttribute 来处理，但是有隐患，所以暂时不支持相对路径
        // WHITELIST.removeProtocols("a", "href", "ftp", "http", "https", "mailto");
        // WHITELIST.removeProtocols("img", "src", "http", "https");
        return relaxedSafelist;
    }

    public static void main3(String[] args){
        try {
            //代表网络中的一个资源路径
            URL url = new URL("https://blog.csdn.net/weixin_41571334/article/details/84631904");
            //parse(URL url, int timeoutMillis):通过网络路径来解析html或xml文档对象
            Document document = Jsoup.parse(url,1000000);
            System.out.println(document);
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}
